home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / CH_5.2 / LINEFEAT / LINEFEAT.C < prev    next >
C/C++ Source or Header  |  1999-09-11  |  6KB  |  193 lines

  1. /*
  2.  * linefeat.c
  3.  *
  4.  * Practical Algorithms for Image Analysis
  5.  *
  6.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  7.  */
  8.  
  9.  
  10. /* LINEFEAT:    program decodes PCC and writes out line features
  11.  *              usage: linefeat infile [-s] [-L]
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include "pcc2.h"               /* for PCC programs */
  18. extern void print_sos_lic ();
  19.  
  20. unsigned char *fcCode;          /* code storage */
  21. long nByteCode;                 /* no. bytes in code storage */
  22.  
  23. long usage (short);
  24. long input (int, char **, short *);
  25.  
  26. main (argc, argv)
  27.      int argc;
  28.      char *argv[];
  29. {
  30.   long width, height;           /* image size */
  31.   struct attributes *attr;      /* level 1 attributes */
  32.   long nAttr;                   /* no. of line structures in attr. array */
  33.   short sumFlag;                /* flag =1, write out only summary; or =0 */
  34.   long sumLength;               /* sum of line lengths */
  35.   long sumPix;                  /* sum of number of pixels in lines */
  36.   long sumBoxX, sumBoxY;        /* sum of bounding box x,y lengths */
  37.   long sumX, sumY;              /* sum of x,y centroids of lines */
  38.   long i;
  39.  
  40. /* user input */
  41.   if (input (argc, argv, &sumFlag) < 0)
  42.     return (-1);
  43.  
  44. /* open input PCC file */
  45.   if (pccread (argv[1], &fcCode, &nByteCode, &width, &height) == -1)
  46.     exit (1);
  47.   printf ("image size: %dx%d, PCC length = %d\n", width, height, nByteCode);
  48.  
  49. /* construct tables of PCC decodes */
  50.   pccdecodes ();
  51.  
  52. /* construct TLC level 1 array of attributes */
  53.   tlc1attr (&attr, &nAttr);
  54.  
  55. /* summary information */
  56.   sumLength = sumPix = sumBoxX = sumBoxY = sumX = sumY = 0;
  57.   for (i = 0; i < nAttr; i++) {
  58.     sumLength += attr[i].length;
  59.     sumPix += attr[i].nPts;
  60.     sumBoxX += (attr[i].box.max.x - attr[i].box.min.x);
  61.     sumBoxY += (attr[i].box.max.y - attr[i].box.min.y);
  62.     sumX += attr[i].sumPt.x;
  63.     sumY += attr[i].sumPt.y;
  64.   }
  65.   printf ("Line Feature Summary:\n");
  66.   printf ("\tnumber of line features = %d\n", nAttr);
  67.   printf ("\taverage line length = %5.1f\n", (double) sumLength
  68.           / ((double) nAttr * 10.0));
  69.   printf ("\taverage number of pixels per line = %5.1f\n",
  70.           (double) sumPix / (double) nAttr);
  71.   printf ("\taverage bounding box size = %5.1f x %5.1f [pixels]\n",
  72.           (double) sumBoxX / (double) nAttr,
  73.           (double) sumBoxY / (double) nAttr);
  74.   printf ("\taverage of line centroid locations = (%5.1f,%5.1f)\n",
  75.           (double) sumX / (double) sumPix, (double) sumY / (double) sumPix);
  76.  
  77. /* print line features for each line segment */
  78.  
  79.   if (sumFlag)
  80.     return (1);
  81.   printf ("\nLine Features:\n");
  82.   for (i = 0; i < nAttr; i++) {
  83.     printf ("\n%d: ", i);
  84.     if (attr[i].type == 1)
  85.       printf ("Endline to Endline\n");
  86.     if (attr[i].type == 2)
  87.       printf ("Endline to Bifurcation\n");
  88.     if (attr[i].type == 3)
  89.       printf ("Endline to Cross\n");
  90.     if (attr[i].type == 4)
  91.       printf ("Bifurcation to Endline\n");
  92.     if (attr[i].type == 5)
  93.       printf ("Bifurcation to Bifurcation\n");
  94.     if (attr[i].type == 6)
  95.       printf ("Bifurcation to Cross\n");
  96.     if (attr[i].type == 7)
  97.       printf ("Cross to Endline\n");
  98.     if (attr[i].type == 8)
  99.       printf ("Cross to Bifurcation\n");
  100.     if (attr[i].type == 9)
  101.       printf ("Cross to Cross\n");
  102.     if (attr[i].type == 10)
  103.       printf ("Line Break to End\n");
  104.     if (attr[i].type == 11)
  105.       printf ("Line Break to Bifurcation\n");
  106.     if (attr[i].type == 12)
  107.       printf ("Line Break to Cross\n");
  108.     if (attr[i].type == 13)
  109.       printf ("Bifurcation Break to Endline\n");
  110.     if (attr[i].type == 14)
  111.       printf ("Bifurcation Break to Bifurcation\n");
  112.     if (attr[i].type == 15)
  113.       printf ("Bifurcation Break to Cross\n");
  114.     if (attr[i].type == 16)
  115.       printf ("Cross Break to Endline\n");
  116.     if (attr[i].type == 17)
  117.       printf ("Cross Break to Bifurcation\n");
  118.     if (attr[i].type == 16)
  119.       printf ("Cross Break to Cross\n");
  120.     printf ("\tlength = %5.1f, no. pixels = %d\n",
  121.             ((double) attr[i].length / 10.0), attr[i].nPts);
  122.     printf ("\tstart and end coordinates: (%d,%d),(%d,%d)\n",
  123.             attr[i].pt1.x, attr[i].pt1.y, attr[i].pt2.x, attr[i].pt2.y);
  124.     printf ("\tstart and end line directions: %d, %d [deg]\n",
  125.             attr[i].dirn1, attr[i].dirn2);
  126.     printf ("\tbounding box: (%d,%d),(%d,%d)\n", attr[i].box.min.x,
  127.             attr[i].box.min.y, attr[i].box.max.x, attr[i].box.max.y);
  128.     printf ("\tcentroid: (%d,%d)\n", attr[i].sumPt.x / attr[i].nPts,
  129.             attr[i].sumPt.y / attr[i].nPts);
  130.   }
  131.   return (0);
  132. }
  133.  
  134.  
  135. /* USAGE:       function gives instructions on usage of program
  136.  *                    usage: usage (flag)
  137.  *              When flag is 1, the long message is given, 0 gives short.
  138.  */
  139.  
  140. long
  141. usage (flag)
  142.      short flag;                /* flag =1 for long message; =0 for short message */
  143. {
  144.  
  145. /* print short usage message or long */
  146.   printf ("USAGE: linefeat infile [-s] [-L]\n");
  147.   if (flag == 0)
  148.     return (-1);
  149.  
  150.   printf ("\nlinefeat lists line features.\n\n");
  151.   printf ("ARGUMENTS:\n");
  152.   printf ("    infile: input filename (PCC)\n\n");
  153.   printf ("OPTIONS:\n");
  154.   printf ("        -s: only summary is printed.\n");
  155.   printf ("        -L: print Software License for this module\n");
  156.  
  157.   return (-1);
  158. }
  159.  
  160.  
  161. /* INPUT:       function reads input parameters
  162.  *                  usage: input (argc, argv, sumFlag)
  163.  */
  164.  
  165. #define USAGE_EXIT(VALUE) {usage (VALUE); return (-1);}
  166.  
  167. long
  168. input (argc, argv, sumFlag)
  169.      int argc;
  170.      char *argv[];
  171.      short *sumFlag;
  172. {
  173.   long n;
  174.  
  175.   if (argc == 1)
  176.     USAGE_EXIT (1);
  177.  
  178.   *sumFlag = 0;
  179.  
  180.   for (n = 2; n < argc; n++) {
  181.     if (strcmp (argv[n], "-s") == 0)
  182.       *sumFlag = 1;
  183.     else if (strcmp (argv[n], "-L") == 0) {
  184.       print_sos_lic ();
  185.       exit (0);
  186.     }
  187.     else
  188.       USAGE_EXIT (0);
  189.   }
  190.  
  191.   return (0);
  192. }
  193.